ROTA DE FUGA: Saia desta sala. Vire à direita e caminhe 3 metros até o final do corredor, onde você estará em frente a uma grande sala de conferências. Vire à esquerda e caminhe mais 3 metros até chegar ao final do corredor. À sua esquerda estará um alarme de incêndio, perto do elevador. À sua direita, no final do corredor, há uma escadaria. Não vá ao elevador. Vire à direita e caminhe mais 4 metros até o final do corredor, vire à esquerda e desça pelas escadas. Desça dois lances de escadas e saia do prédio na porta na parte inferior das escadas.
Fonte: Adaptado de Berinato (2016)
O ggplot é um pacote criado pelo Hadley Wickham com o objetivo de operacionalizar a teoria do livro “The Grammar of Graphics” de Leland Wilkinson.
A ideia básica do ggplot é a de que um gráfico é construído a partir de camadas de elementos, assim como uma frase:
A turma está super animada para aprender os próximos códigos
Se os adjetivos, verbos, ou substantivos fossem alterados, o sentido da frase seria totalmente alterado.
| Função | Finalidade |
|---|---|
| filter() | Filtar a planilha a partir dos valores de determinadas colunas |
| select() | Selecionar colunas |
| slice() | Selecionar linhas |
| arrange() | Classificar/ordenar a planilha a partir de determinadas colunas |
| mutate() | Criar uma nova coluna na planilha |
| summarise() | Calcular as estatísticas (média, soma, etc.) das colunas das planilhas |
| group_by() | Agrupar a base pelos valores de determinadas colunas. Feito isso, todas as funções anteriores se aplicam aos grupos criados |
A primeira camada é a base de dados utilizada para plotar os gráficos. Obviamente, isso ainda não é suficiente para criar um gráfico
A segunda camada (Estética) basicamente consiste em dizer para o R o que vai no eixo X e o que vai no eixo Y
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))
A terceira camada (Geometria) é a responsável pelos elementos visuais do gráfico
#Usando a geometria de linha
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = TRUE))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line()
#Usando a geometria de colunas
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()
#Usando a geometria de área
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_area()
#Usando a geometria de pontos
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_point() +
labs(x="Ano", y="Média anual da força de trabalho")
#Usando a geometria de texto
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
jn1$media <- round(jn1$media, 0)
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_label(aes(label=media))
#Usando a geometria de texto
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
jn1$media <- round(jn1$media, 0)
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_text(aes(label=media))
#Combinando a geometria de colunas com a de texto
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
jn1$media <- round(jn1$media, 0)
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
geom_label(aes(x=ano, y=media, label=media))
#Combinando as geometrias de linhas e pontos
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
jn1$media <- round(jn1$media, 0)
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line()+
geom_point(aes(x=ano, y=media))
A quarta camada, Facet, permite dividir o gráfico criado a partir de uma terceira variável
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line()+
facet_wrap(~justica, scale="free_y") #Escala "livre" permite uma melhor visualização
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
facet_wrap(~justica, scale="free_y")
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm=TRUE))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line() +
labs(x="Ano", y="Média da força de trabalho")+
coord_cartesian(ylim=c(0,10000))
jn1 <- group_by(jn, sigla)
jn1 <- summarise(jn1,media=mean(ftt, na.rm = T))
jn1 <- arrange(jn1, desc(media))
jn1 <- slice(jn1, 1:30)
jn1 <- filter(jn1, !sigla %in% c("TJ", "TRF", "TRT", "TRE"))
ggplot(data=jn1, mapping=aes(x=sigla, y=media))+
geom_col()+
coord_flip()
jn1 <- group_by(jn, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=1, y=media, fill=justica))+
geom_col()+
coord_polar(theta = "x") #Eixo que será "angularizado"
jn1 <- group_by(jn, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=1, y=media, fill=justica))+
geom_col()+
coord_polar(theta = "y") #Eixo que será "angularizado"
Existem três elementos visuais (isto é, que não são dados) que podemos alterar nesta camada usando a função theme():
Cada um dos elementos do gráfio pode ser modificado individualmente, por exemplo: Título do gráfico, título do eixo x, linha do eixo y, retângulo da legenda, etc.
Porém, caso se deseje alterar todos os elementos textuais, linhas ou retângulos, podemos utilizar um dos três elementos abaixo:
text
line
rect
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
theme(text=element_blank(),
line=element_blank(),
rect = element_blank())
jn1 <- group_by(jn, sigla)
jn1 <- summarise(jn1,media=mean(ftt, na.rm = T))
jn1 <- top_n(jn1, n=30, wt=media)
jn1 <- filter(jn1, !sigla %in% c("TJ", "TRF", "TRT", "TRE"))
ggplot(data=jn1, mapping=aes(x=sigla, y=media))+
geom_col()+
ggtitle("Teste")+
theme(axis.title = element_text(color = "red", hjust = 0.5, face = "bold", family= "serif"),
axis.text.x = element_text(color = "black", angle = 45, family="sans"),
plot.title = element_text(color="blue", face="bold", hjust=0.5, family="serif", size=20))
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
theme(panel.grid = element_line(color="blue", size=2),
axis.line = element_line(color = "red", size=3))
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
theme(plot.background = element_rect(fill = "#DDDDDD", color="black",
size=3),
panel.background = element_rect(fill="white", color="black", size=1))
Se vocês não estão dispostos a mudar cada detalhe dos seu gráfico, podemos usar os templates fornecidos pelo ggplot: classic, dark, grey, bw, light, etc.
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
theme_classic()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
theme_dark()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
theme_bw()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
theme_light()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
theme_void()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line(color="red")+
theme_classic()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line(color="blue", size=3)+
theme_classic()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line(color="blue", size=3, alpha=0.1)+
theme_classic()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line(color="blue", size=3, linetype=2)+
theme_classic()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col(color="black", fill="steelblue", width = 0.2, alpha=0.6)+
theme_classic()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_line(color="steelblue", size=2,linetype=2)+
geom_point(aes(x=ano, y=media),color="red", fill="green", size=3, shape=23)
Geralmente, precisamos plotar gráficos com mais de 2 duas dimensões. Existem vários argumentos para realizar essa tarefa, como color, group, size, shape, etc.
Obs: Alguns argumentos somente funcionam para alguns tipos de geometrias
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media, color=justica))+
geom_line()+
labs(x="Ano", y="Média de força de trabalho", col="Tipo de Justiça")+
theme_classic()
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media, linetype=justica))+
geom_line()+
theme_classic()
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media, size=justica))+
geom_line()+
theme_classic()## Warning: Using size for a discrete variable is not advised.
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media, fill=justica))+
geom_col()+
theme_classic()
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media, fill=justica))+
geom_area()+
theme_classic()
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media, fill=justica))+
geom_col()+
scale_fill_manual("Tipo de justiça",
values = c("#1B9E77","#D95F02","#7570B3","#E7298A",
"#66A61E", "#E6AB02","#A6761D"),
labels = c("Elec.", "Est.", "Fed.", "M.Est.", "M.União",
"Sup.", "Trab."))+
theme_classic()
Com frequência, observamos uma sobreposição dos dados da nossa base. Para resolver isso, podemos usar o argumento position dentro da função de geometria
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media_ftt=mean(ftt, na.rm = T)) #várias médias para o mesmo ano
ggplot(data=jn1, mapping=aes(x=ano, y=media_ftt, fill=justica))+
geom_col(position = "dodge")+
theme_classic()
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media_ftt=mean(ftt, na.rm = T))
ggplot(data=jn1, mapping=aes(x=ano, y=media_ftt, fill=justica))+
geom_col(position = position_dodge(width = 1), alpha=0.6)+
theme_classic()
jn1 <- group_by(jn, ano)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
jn1$media <- round(jn1$media, 0)
ggplot(data=jn1, mapping=aes(x=ano, y=media))+
geom_col()+
geom_text(aes(x=ano, y=media, label=media), position=position_stack(vjust=0.5), color="white")
O pacote RColorBrewer fornece paletas de cores que podem ser utilizadas nos gráficos
## [1] "#1B9E77" "#D95F02" "#7570B3" "#E7298A" "#66A61E" "#E6AB02" "#A6761D"
## [8] "#666666"
Caso o output do R seja um HTML, podemos adicionar um pouco de interatividade aos gráficos usando o pacote Plotly
jn1 <- group_by(jn, ano, justica)
jn1 <- summarise(jn1, media=mean(ftt, na.rm = T))
plot1 <- ggplot(data=jn1, mapping=aes(x=ano, y=media, fill=justica))+
geom_col()+
theme_classic()
#setwd() - Escolhe o diretório
#ggsave("plot1.png", plot=plot1, width = 30, height = 20, units = "cm")
#ggsave("plot1.pdf", plot=plot1, width = 10, height = 30, units = "cm")
Antônio Machado, poeta espanhol